/**
 * 使用栈实现括号匹配：
 * 1. 如果碰到的是左圆括号或者左大括号，直接压栈；
 * 2. 如果碰到的是右圆括号或者右大括号，就直接和栈顶元素配对；
 * 如果匹配，栈顶元素弹栈；反之，括号不匹配；
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int top=-1;

void push(char* array,int elem);

void pop(char* array);

//查询栈顶元素
char visit(char* array);

int main()
{
	char symbol_array[100];		//符号数组，用来存放符号序列
	char stack_array[50];		//符号数组，用来对字符的压栈和出栈
	printf("请输入括号序列:");
	scanf("%s",symbol_array);	//scanf()不能读取回车，空格和回车表示输入完毕
	
	getchar();			//只能读取用户输入缓存区的一个字符，包括回车
	int length=strlen(symbol_array);
	for(int i=0;i<length;i++)
	{
		if(symbol_array[i]=='[' || symbol_array[i]=='{' || symbol_array[i]=='(')
			push(stack_array, symbol_array[i]);
		else{
			//如果是};);],判断对应的符号是否匹配
			if(symbol_array[i]==')')
			{
				if(visit(stack_array)=='('){
					pop(stack_array);	//匹配则出栈
				} else {
					printf("括号不匹配\n");
					return 0;
				}
			} else if(symbol_array[i]=='}'){
				if(visit(stack_array)=='{'){
					pop(stack_array);
				} else {
					printf("括号不匹配\n");
					return 0;
				}
			} else{
				if(symbol_array[i]==']'){
					if(visit(stack_array)=='['){
						pop(stack_array);
					} else {
						printf("括号不匹配\n");
						return 0;
					}
				}
			}
		}
	}
	if(top!=-1) printf("括号不匹配\n");
	else printf("括号匹配成功\n");
	
	
}


void push(char* array,int elem)
{
	array[++top]=elem;
}

void pop(char* array)
{
	if(top==-1) return;
	top--;
}

char visit(char* array)
{
	if(top!=-1) return array[top];
	else return ' ';
}